var oTable;
var DiasSemana = new Array('Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa');

var LabGeneralData = function(codigo_area_academica, nombre_laboratorio, nombre_mostrar_laboratorio,
        descripcion, fecha_inicio, fecha_fin, hora_inicio, hora_fin, dias_semana) {
    this.codigo_area_academica = codigo_area_academica;
    this.nombre_laboratorio = nombre_laboratorio;
    this.nombre_mostrar_laboratorio = nombre_mostrar_laboratorio;
    this.descripcion = descripcion;
    this.fecha_inicio = fecha_inicio;
    this.fecha_fin = fecha_fin;
    this.hora_inicio = hora_inicio;
    this.hora_fin = hora_fin;
    this.dias_semana = dias_semana;
//    this.vmalumnos = vmalumnos;
};

var Vm = function(cantidad, serviceOffering, diskOffering, template) {
    this.cantidad = cantidad;
    this.serviceOffering = serviceOffering;
    this.diskOffering = diskOffering;
    this.template = template;
};

var Grupo = function(serviceOffering, diskOffering, template, descripcion_template) {
    this.serviceOffering = serviceOffering;
    this.diskOffering = diskOffering;
    this.template = template;
    this.descripcion_template = descripcion_template;
};

/**
 *  Inicializa los date pickers con la fecha actual.
 */
function initDateFields() {
    $.ajax({
        url: '/admin/common/getdate/',
        dataType: 'html',
        type: 'post',
        success: function(data) {
            $("#fecha-inicio").datepicker();
            $("#fecha-inicio").datepicker("option", "dateFormat", "yy-mm-dd");
            $("#fecha-inicio").datepicker("setDate", data);
            $("#fecha-fin").datepicker();
            $("#fecha-fin").datepicker("option", "dateFormat", "yy-mm-dd");
            $("#fecha-fin").datepicker("setDate", data);
        }
    });
}

function addRemoveTeacher()
{
    $('#btn-add-teacher').click(function() {
        $('#teacher-from option:selected').each(function() {
            $('#teacher-to').append("<option value='" + $(this).val() + "'>" + $(this).text() + "</option>");
            $(this).remove();
        });
    });

    $('#btn-remove-teacher').click(function() {
        $('#teacher-to option:selected').each(function() {
            $('#teacher-from').append("<option value='" + $(this).val() + "'>" + $(this).text() + "</option>");
            $(this).remove();
        });
    });
}

/**
 * Muestra la seccion de asignacion de miembros del laboratorio. Debe estar ya 
 * seleccionado el codigo de laboratorio.
 */
function showMembers() {
    var codigoLaboratorio = $('#codigo-laboratorio').val();

    if (codigoLaboratorio > 0) {
        $('#members-container').toggle('slow');
    } else {
        alert('Primero debe ingresar los datos generales');
    }
}

/**
 * 
 * @returns {undefined}
 */
function showNetwork() {
    var codigoLaboratorio = $('#codigo-laboratorio').val();
    var codigoMiembro = '';
    $('#teacher-to option').each(function() {
        codigoMiembro += ($(this).val());
    });

    if (codigoLaboratorio > 0 && codigoMiembro.length > 0) {
        $('#network-container').toggle('slow');
    } else {
        alert('Primero debe seleccionar un profesor');
    }
}

/**
 * Muestra la seccion de asignacion de maquinas virtuales. Deben estar ya 
 * seleccionados el codigo de laboratorio y el codigo de profesor.
 */
function showMachines() {
    //    var codigoNetwork= $('#codigo-network').val();
    //    
    //    if(codigoNetwork > 0){
    loadTemplates();
    $('#machines-container').toggle('slow');
//    }else{
//        alert('Primero debe seleccionar un profesor');
//    }
}

function saveProfesores() {
    $.blockUI({
        message: 'Un momento por favor.'
    });
    var profesores = new Array();
    var i = 0;
    $('#teacher-to option').each(function() {
        profesores [i++] = ($(this).val());
    });
    if ($('#codigo-laboratorio').val() > 0) {
        $.ajax({
            url: '/admin/laboratorio/saveprofesores/',
            data: {
                'profes': profesores,
                'codigo_laboratorio': $('#codigo-laboratorio').val()
            },
            dataType: 'json',
            type: 'post',
            success: function(data) {
                if (data.response === 'error') {
                    bootbox.alert(data.msg, function() {
                    });
                } else {
                    response = data.response;
                    $('#members-container').toggle('slow');
                    $('#network-container').removeClass('hidden').toggle('slow');
                }
                $.unblockUI();
            }
        });
    } else {
        bootbox.alert("Favor verificar los datos");
        $.unblockUI();
    }
}

function getVirtualNetwork() {

    if ($('#codigo-laboratorio').val() > 0) {
        $.ajax({
            url: '/admin/laboratorio/getnetwork/',
            data: {
                'codigo_laboratorio': $('#codigo-laboratorio').val()
            },
            dataType: 'json',
            type: 'post',
            success: function(data) {
                if (data.response === 'error') {
                    console.log(data.msg);
                } else {

                    $('#ip-asignada').val(data.ip);
                    $('#gateway').val(data.gw);
                    $('#gateway').attr('readonly', 'true');
                    $('#netmask').val(data.netmask);
                    $('#netmask').attr('readonly', 'true');
                }
            },
            onFailure: function(a, b, c) {
                console.log(a);
                console.log(b);
                console.log(c);
                $.unblockUI();
            }
        });
    }
}

function createNetwork() {
    $.blockUI({
        message: 'Un momento por favor.'
    });
    var profesores = new Array();
    var i = 0;
    $('#teacher-to option').each(function() {
        profesores [i++] = ($(this).val());
    });

    $.ajax({
        url: '/admin/laboratorio/createnetwork/',
        data: {
            'codigo_laboratorio': $('#codigo-laboratorio').val(),
            'gateway': $('#gateway').val(),
            'netmask': $('#netmask').val()
        },
        dataType: 'json',
        type: 'post',
        success: function(data) {
            if (data.response === 'error') {
                alert(data.msg);
                console.log(data.msg);

            } else {
                $("#codigo-network").val(data.id);
                $('#network-container').toggle('slow');
                $('#machines-container').removeClass('hidden').toggle('slow');
            }
            $.unblockUI();
        },
        onFailure: function(a, b, c) {
            console.log(a);
            console.log(b);
            console.log(c);
            $.unblockUI();
        }
    });
}

/**
 * Recupera los templates desde el cloud stack y los carga en un 
 * select.
 */
function loadTemplates() {
    $('#plantilla').load('/admin/common/listtemplates/tipo/' + $("#tipo-plantilla").val());
}

/**
 * Recupera los profesores desde el la base de datos y los carga en un 
 * select.
 */
function loadTeachers() {
    $.ajax({
        url: '/admin/filter/getteachers/codigo_laboratorio/' + $('#codigo-laboratorio').val(),
        dataType: 'json',
        type: 'post',
        success: function(data) {
            $('#teacher-from').html(data.profes);
            $('#teacher-to').html(data.profes_asociados);
        }
    });
}

/**
 * Recupera los codigos de areas academicas desde el la base de datos y los carga en un 
 * select.
 */
function loadAreasAcademicas() {
    $('#codigo-area-academica').load("/admin/filter/getareasacademicas/");
}

/**
 * Recupera los disk offerings desde el cloud stack y los carga en un 
 * select.
 */
function loadDiskOffering() {
    $('#disk-offering').load("/admin/common/listdiskofferings/");
}

/**
 * Recupera los service offerings desde el cloud stack y los carga en un 
 * select.
 */
function loadServiceOffering() {
    $('#service-offering').load("/admin/common/listserviceofferings/");
}

function waitAnswer(data) {
    var response = false;
    $.ajax({
        url: '/admin/laboratorio/checkdeployjobstatus/' + data.deployvirtualmachineresponse.jobid,
        async: false,
        dataType: 'json',
        type: 'post',
        success: function(data) {
            response = data.response;
        }
    });
    return response;
}

function graficarConsumo() {
    var dias = $.post('/admin/laboratorio/getconsumolab/codigo_laboratorio/' + $('#codigo-laboratorio').val(),
            {codigo_laboratorio: $('#codigo-laboratorio').val()}, function(data, textStatus, jqXHR) {
        if (data.response === "error")
        {
        } else if (data.response === "success") {
//            var contenidoGrafico = "";
            $("#graficos").html("");
            $.each(data, function(i, v) {
                if (i === "response") {
                    return;
                }
                var contenidoGrafico = "<div style='margin:0' class='row-fluid span12'><div class='row-fluid span12'><strong>" + v.dia + " " + v.hora_inicio + " - " + v.hora_fin + "</strong></div>";
                contenidoGrafico += "<div class='row-fluid' style='width:260px; float: left;'>Memoria <div style='margin-left: 0px;' class='slider_bar' id='" + i + "-memory'></div></div><div class='row-fluid span2'>" + v.memory + " %</div>";
                contenidoGrafico += "<div class='row-fluid' style='width:260px; float: left;'>CPU <div style='margin-left: 0px;' class='slider_bar' id='" + i + "-cpu'></div></div><div class='row-fluid span2'>" + v.cpu + " %</div></div>";
                console.log(contenidoGrafico);
                $("#graficos").append(contenidoGrafico);
                $("#" + i + "-memory").sGlide({
                    startAt: v.memory,
                    height: 15,
                    width: 250,
                    unit: 'px',
                    disabled: true,
                    colorStart: '#58F179',
                    colorEnd: '#D11919'
                });
                $("#" + i + "-cpu").sGlide({
                    startAt: v.cpu,
                    height: 15,
                    width: 250,
                    unit: 'px',
                    disabled: true,
                    colorStart: '#58F179',
                    colorEnd: '#D11919'
                });
            });
            return;
        }
    }, 'json');
}
function reloadTableGroupsCreated() {
    if (oTable) {
        oTable.fnDestroy();
    }
    oTable = $('#groups-created').dataTable({
        "oLanguage": {
            "sLengthMenu": "_MENU_ records per page"
        },
//        "sDom": "<'row'<'span6'l>r>t<'row'<'span6'i>>",
        "sPaginationType": "bootstrap",
        aoColumnsDef: [],
        "bAutoWidth": false,
        "bPaginate": false,
        bLengthChange: false,
        "bFilter": false,
        "bSort": false,
        "bInfo": false,
        "aoColumns": [
            {
                sWidth: '75px',
                "sTitle": "Cantidad de grupos en VLab"
            },
            {
                sWidth: '75px',
                "sTitle": "Cantidad total de VM"
            },
            {
                sWidth: '150px',
                "sTitle": "Descripci&oacute;n software base"
            }
        ],
        "sAjaxSource": "/admin/laboratorio/groupscreated/codigo_laboratorio/" + $('#codigo-laboratorio').val(),
        "fnServerData": function(sSource, aoData, fnCallback) {
            $.ajax({
                "url": sSource,
                "data": aoData,
                "success": fnCallback,
                "contentType": "application/json; charset=utf-8",
                "dataType": "json",
                "cache": false,
                "error": function(xhr, error, thrown) {
                    $("#div-alert").append('<div class="alert alert-danger alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button><strong>Error! </strong>' + thrown + '</div>');
                }
            });
        }
    });

}
function crearGrupo() {
    var grupo = new Array();
    var rowCount = 0;
    var asignable = false;

    if (undefined === typeof($('#codigo-laboratorio').val())) {
        bootbox.alert("Debe configurar al menos una m&aacute;quina virtual.");
        return;
    }
    if ($('#asignable:checked').length > 0) {
        asignable = true;
    }

    $("#assigned-vm-table").find("tr").each(function(i) {
        if (i > 0) {
            var plantilla, service, disk, template_descripcion;
            plantilla = $(this).find("#plantilla-tmp").val();
            service = $(this).find("#service-tmp").val();
            disk = $(this).find("#disk-tmp").val();
            template_descripcion = $(this).find("#plantilla-descripcion").val();

            grupo[i - 1] = new Grupo(service, disk, plantilla, template_descripcion);
        }
        rowCount++;
    });
    if (rowCount === 0) {
        bootbox.alert("Debe configurar al menos una m&aacute;quina virtual.");
        return;
    }
    var cantidad = $("#cantidad-grupo").val();
    if (cantidad === 0 || cantidad === "") {
        bootbox.alert("Debe configurar al menos una m&aacute;quina virtual.");
        return;
    }
    $.blockUI({
        message: 'Un momento por favor.'
    });
    $.ajax({
        url: '/admin/laboratorio/controlavailabletocreate/',
        dataType: 'json',
        data: {
            codigo_laboratorio: $('#codigo-laboratorio').val(),
            cantidad: cantidad,
            asignable: asignable,
            perfiles: JSON.stringify(grupo)
        },
        type: 'post',
        success: function(data) {
            console.log(data);
            if (data.response === 1) {
                $.ajax({
                    url: '/admin/laboratorio/creargrupo/',
                    dataType: 'json',
                    data: {
                        codigo_laboratorio: $('#codigo-laboratorio').val(),
                        cantidad: cantidad,
                        asignable: asignable,
                        perfiles: JSON.stringify(grupo)
                    },
                    type: 'post',
                    success: function(data) {
//            console.log(data);
                        if (data.response === "error") {
                            bootbox.alert(data.msg);
                        } else if (data.response === "success") {
                            bootbox.alert("Se ha creado el grupo de perfiles.");
                            $("#assigned-vm-table").find("tr").each(function(i) {
                                if (i > 0)
                                    $(this).remove();
                            });
                            $("#cantidad-grupo").val('');
                            $("#asignable").attr("checked", false);
                            graficarConsumo();
                        }
//            reloadTableGroupsCreated();
                        $.unblockUI();
                        reloadTableGroupsCreated();
                    },
                    timeout: 20000,
                    error: function(jqXHR, textStatus, errorThrown) {
                        if (textStatus === 'timeout') {
                            // mostrar mensaje de timeout
                        } else {
                            // mostrar mensaje de error ocurrido 
                            console.log(errorThrown);
                        }
                        $.unblockUI();
                    }
                });
            } else {
                $.unblockUI();
                bootbox.alert("No se dispone de capacidad suficiente.");
            }
        },
        timeout: 20000,
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(errorThrown);
            if (textStatus === 'timeout') {
                // mostrar mensaje de timeout
            } else {
                // mostrar mensaje de error ocurrido 
                console.log(errorThrown);
            }
            $.unblockUI();
        }
    });

}
/**
 * Despliega las maquinas virtuales en el cloudstack.
 */
function deployVMs() {
    var vmRows = new Array();
    var rowCount = 0;
    reloadTableGroupsCreated();
    $("#assigned-vm-table").find("tr").each(function(i) {
        if (i > 0) {
            var cantidad, plantilla, service, disk;
            cantidad = $(this).find("#cantidad-tmp").val();
            plantilla = $(this).find("#plantilla-tmp").val();
            service = $(this).find("#service-tmp").val();
            disk = $(this).find("#disk-tmp").val();

            vmRows[i - 1] = new Vm(cantidad, service, disk, plantilla);
        }
        rowCount++;
    });
    if (rowCount === 0) {
        bootbox.alert("Debe configurar al menos una m&aacute;quina virtual.");
        return;
    }

    //    console.log("vmrows : " + vmRows);
    $.blockUI({
        message: 'Un momento por favor.'
    });

    $.ajax({
        url: '/admin/laboratorio/deployvm/',
        dataType: 'json',
        data: {
            labCode: $('#codigo-laboratorio').val(),
            vms: JSON.stringify(vmRows)
        },
        type: 'post',
        success: function(data) {
            console.log(data);
            window.location.href = '/admin/virtualmachine/lab/laboratorio/' + $('#codigo-laboratorio').val();
        },
        timeout: 20000,
        error: function(jqXHR, textStatus, errorThrown) {
            if (textStatus === 'timeout') {
                // mostrar mensaje de timeout
            } else {
                // mostrar mensaje de error ocurrido 
                console.log(errorThrown);
            }
            $.unblockUI();
        }
    });
}

/**
 * Vuelve al listado de laboratorios.
 */
function back() {
    window.location.href = '/admin/laboratorio/';
}


/**
 * Teniendo en cuenta el valor de codigo_area_academica, carga los cursos 
 * relacionados con dicha area. 
 */
function loadCourses() {
    var area = $('#codigo_area_academica').val();
    var curso = $('#codigo_curso').val();
    $('#codigo_curso').load("/admin/filter/getcursosbyarea/codigo_area_academica/" + area + "/codigo_curso/" + curso);
}

/**
 *
 *
 */
$(document).ready(function() {
    menuClass('laboratorio');
    initDateFields();
    loadTeachers();
    loadDiskOffering();
    loadAreasAcademicas();
    loadServiceOffering();
    loadTemplates();
    addRemoveTeacher();
    getVirtualNetwork();
    reloadTableGroupsCreated();
    graficarConsumo();
    $('#btn-deploy').click(crearGrupo);
    $('#btn-add-vm').click(addVmRow);

    jQuery.validator.setDefaults({
        debug: true,
        success: "valid"
    });

    $('#general-data-form').validate({
        rules: {
            "cantidad-horas-curso": {
                required: true,
                number: true
            },
            "fecha-inicio": {
                required: true,
                date: true
            },
            "fecha-fin": {
                required: true,
                date: true
            },
            "nombre-laboratorio": {
                required: true
            },
            "nombre-mostrar-laboratorio": {
                required: true
            },
//            "vmalumnos-laboratorio": {
//                required: true,
//                range: [1,5]
//            },
            'hora-inicio': {
                required: true
            },
            'hora-fin': {
                required: true
            }
        }
    });
    $('#machines-form').validate({
        rules: {
            'hora-inicio': {
                required: true,
                number: true
            },
            'minuto-inicio': {
                required: true,
                number: true
            },
            'hora-fin': {
                required: true,
                number: true
            },
            'minuto-fin': {
                required: true,
                number: true
            },
            'cantidad-horas-total': {
                required: true,
                number: true
            },
            'cantidad-horas-diaria': {
                required: true,
                number: true
            },
            'cantidad-maquinas': {
                required: true,
                number: true
            }
        }
    });
});

function formatTime(h) {
    var hora = h.split(":");
    if (isNaN(hora[0]) || isNaN(hora[1]))
        return false;
    if (parseInt(hora[0]) < 24 && parseInt(hora[0]) > -1) {
        if (parseInt(hora[1]) < 60 && parseInt(hora[1]) > -1)
        {
            console.log(parseInt(hora[0]) + " " + parseInt(hora[1]));
            return true;
        }
    }
    return false;
}

function compareTime(h1, h2) {
    var hora1 = h1.split(":");
    var hora2 = h2.split(":");
    if (isNaN(hora1[0]) || isNaN(hora1[1]) || isNaN(hora2[0]) || isNaN(hora2[1]))
        return false;

    if (parseInt(hora1[0]) < parseInt(hora2[0])) {
        return true;
    } else if (parseInt(hora1[0]) === parseInt(hora2[0])) {
        if (parseInt(hora1[1]) <= parseInt(hora2[1])) {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

function cleanArray(actual) {
    var newArray = new Array();
    for (var i = 0; i < actual.length; i++) {
        if (actual[i]) {
            newArray.push(actual[i]);
        }
    }
    return newArray;
}

/**
 * Agrega una linea a la grilla de maquinas virtuales del laboratorio.
 */
function addVmRow(e) {
    e.preventDefault();

    if (!$('#machines-form').valid())
        return;
    if ($('#cantidad-maquinas').val() < 0 || $('#cantidad-horas-diaria').val() < 0 || $('#cantidad-horas-total').val() < 0 || $('#hora-inicio').val() < 0 || $('#minuto-inicio').val() < 0 || $('#hora-fin').val() < 0 || $('#minuto-fin').val() < 0) {
        bootbox.alert("No ser permiten valores negativos.");
        return;
    }

    var row = "<tr><td><a href='#assigned-vm-table' onclick='removeTableRow($(this).parent().parent())'><i class='icon-remove'></i></a></td>";
    row += "<td><input id='plantilla-tmp' type='hidden' value='" + $("#plantilla").val() + "'/><input id='plantilla-descripcion' type='hidden' value='" + $("#plantilla option:selected").text() + "'/>" +
            $("#plantilla option:selected").text() + "</td>";
    row += "<td><input id='service-tmp' type='hidden' value='" + $("#service-offering").val() + "'/>" +
            $("#service-offering option:selected").text() + "</td>";
    row += "<td><input id='disk-tmp' type='hidden' value='" + $("#disk-offering").val() + "'/>" +
            $("#disk-offering option:selected").text() + "</td>";

    $("#assigned-vm-table").find('tbody').append(row);
//    $("#btn-add-vm").attr("disabled", "disabled");
    bootbox.alert("Configuraci&oacute;n agregada con &eacute;xito!");
    graficarConsumo();
}

/**
 *
 */
$('#btn-add-teacher').click(function() {
    console.log("username-teacher : " + $('#teacher').val());
    $('#username_profesor').val($('#teacher').val());
});

/**
 * Envia los datos generales del laboratorio para recuperar el codigo de laboratorio
 * a asignar.
 * 
 */
function saveLaboratorio()
{
    // si no es valido no hacemos naranja
    if (!$('#general-data-form').valid())
        return;

    $.blockUI({
        message: 'Un momento por favor.'
    });
    var diasSemana = '';
    var diasValue = new Array();
    if ($('#todos').checked) {
        diasValue = new Array('Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa');
    } else {
        var i = 0;
        if ($('#domingo').is(':checked')) {
            diasValue[i] = 'Do';
            i++;
        }
        if ($('#lunes').is(':checked')) {
            diasValue[i] = 'Lu';
            i++;
        }
        if ($('#martes').is(':checked')) {
            diasValue[i] = 'Ma';
            i++;
        }
        if ($('#miercoles').is(':checked')) {
            diasValue[i] = 'Mi';
            i++;
        }
        if ($('#jueves').is(':checked')) {
            diasValue[i] = 'Ju';
            i++;
        }
        if ($('#viernes').is(':checked')) {
            diasValue[i] = 'Vi';
            i++;
        }
        if ($('#sabado').is(':checked')) {
            diasValue[i] = 'Sa';
            i++;
        }
    }

    diasValue = cleanArray(diasValue);

    if (!formatTime($("#hora-inicio").val()) || !formatTime($("#hora-fin").val()) || !compareTime($("#hora-inicio").val(), $("#hora-fin").val())) {
        bootbox.alert("Favor verifique el horario.");
        $.unblockUI();
        return;
    }



    var dataToSend = new LabGeneralData($('#codigo-area-academica').val(),
            $('#nombre-laboratorio').val(), $('#nombre-mostrar-laboratorio').val(), $('#descripcion-laboratorio').val(),
            $("#fecha-inicio").val(), $("#fecha-fin").val(), $("#hora-inicio").val(), $("#hora-fin").val(), diasValue);

//    console.log(dataToSend);
    $.ajax({
        url: '/admin/laboratorio/save',
        dataType: 'json',
        type: 'post',
        timeout: 15000,
        data: {
            data: dataToSend,
            codigo_laboratorio: $('#codigo-laboratorio').val()
        },
        success: function(data) {
            //  debemos recuperar el codigo de laboratorio y mostrar el siguiente 
            //  panel
            $.unblockUI();
//            console.log(data);
            if (data.response === "error") {
                bootbox.alert(data.msg, function() {
                });
//                console.log(data.msg);
            } else {
//                console.log(data);
                $('#codigo-laboratorio').val(data.id);
                $('#general-data-container').toggle('slow');
                $('#members-container').removeClass('hidden').toggle('slow');
            }
        },
        error: function(jqXHR, textStatus, errorThrown) {
            if (textStatus === 'timeout') {
                // mostrar mensaje de timeout
            } else {
                // mostrar mensaje de error ocurrido 
                console.log(errorThrown);
            }
            bootbox.alert(errorThrown, function() {
            });
            console.log(errorThrown);
            $.unblockUI();
        }
    });
}
